#ifndef ANALYSIS_H
#define ANALYSIS_H
#include "dirStack.h"
#include <errno.h>
#include <sys/types.h>
#include <dirent.h>
#include <unistd.h>
#include <sys/stat.h>
#include <mysql/mysql.h>
#include "my_header.h"

//枚举对应命令类型
enum FlagType{
    FLAG_CD = 1,
    FLAG_LS = 2,
    FLAG_PWD = 3,
    FLAG_MKDIR = 4,
    FLAG_RMDIR = 5,
    FLAG_GETS = 6,
    FLAG_PUTS =7,
    FLAG_REMOVE = 8
};


//结构体，第一个为传出对应命令的结果，第二个为对应命令类型
typedef struct Canalysis_s{
    char result[1024];//返回结果
    int resultLength;//返回结果的大小
    int pwd;//当前目录的主键
    int flag;//表示收到的命令种类
    //将对应file_table的path写入下面的nowpath
    char nowPath[256];//现在路径
    int nowPathLength;//现在路径的字符总长度

    char absolutePath[1024];
    int absolutePathLength;

    MYSQL* mysql;//mysql数据库
    char username[31];
    char lastname[51];//最终文件目录名

}Canalysis_t;

//函数指针类型声明
typedef int (*Funcptr)(const char*,Canalysis_t*);

//判断函数头并更新命令标记类型
int chooseCommand(const char* p,Canalysis_t* anaCommand);
int cdDir(const char* command,Canalysis_t* anaCommand);
int lsDir(const char* command,Canalysis_t* anaCommand);
int pwdDir(const char* command,Canalysis_t* anaCommand);
int mkDir(const char* command,Canalysis_t* anaCommand);
int rmDir(const char* command,Canalysis_t* anaCommand);
int putsFile1(const char* command,Canalysis_t* anaCommand);
int getsFile1(const char* command,Canalysis_t* anaCommand);
int removeFile(const char* command,Canalysis_t* anaCommand);

int strtoken(char* command,dirStack_t* dstack);
int checkPath(char* nowPath,Canalysis_t* anaCommand);
int concatenateString(dirStack_t* dstack,char* result);

int separationCommand(const char* command,Canalysis_t* anaCommand);

int freeCanalysis(Canalysis_t* anaCommand);
int initCanalysis(Canalysis_t* command);

#endif
